import re
import pandas as pd
from opencc import OpenCC

# 初始化OpenCC，用于繁体到简体的转换
cc = OpenCC('t2s')

# 错误处理函数：安全地读取文件
def safe_read_file(filename, mode='r'):
    try:
        with open(filename, mode, encoding='utf-8') as f:
            return set(line.strip() for line in f if line.strip())
    except IOError as e:
        print(f"无法读取文件 {filename}：{str(e)}")
        return set()


# 读取表情词替换字典
emoji_dict = {}
for line in safe_read_file('emoji_dict.txt'):
    try:
        key, value = line.strip().split(':')
        emoji_dict[key] = value
    except ValueError:
        continue

# 读取自定义词典
custom_dict = {}
for line in safe_read_file('custom_dict.txt'):
    parts = line.strip().split(':')
    if len(parts) == 2:
        custom_dict[parts[0]] = parts[1]
    else:
        custom_dict[parts[0]] = parts[0]  # 如果没有替换词，保持原词

# 文本清洗函数
def clean_text(text):
    # 繁体转简体
    text = cc.convert(text)

    # 将所有英文转换为小写
    text = text.lower()

    # 清洗视频ID（移除 av 号、bv 号和 cv 号）
    text = re.sub(r'(av|bv|cv)[\w\d-]+', '', text)

    # 去除URL
    text = re.sub(r'https?://\S+|www\.\S+', '', text)

    # 去除 @ 用户
    text = re.sub(r'@\w+', '', text)

    # 替换表情词，包括 '？', '?', '！', '!'
    for emoji, replacement in sorted(emoji_dict.items(), key=lambda x: len(x[0]), reverse=True):
        text = text.replace(emoji, f' {replacement} ')  # 在替换词周围添加空格

    # 删除未识别的表情符号
    text = re.sub(r'\[.*?\]', '', text)

    # 应用自定义词典替换
    for word, replacement in sorted(custom_dict.items(), key=lambda x: len(x[0]), reverse=True):
        text = text.replace(word, replacement)

    # 保留中文、数字、字母，其他字符替换为单个空格
    text = re.sub(r'[^\u4e00-\u9fa5a-z0-9]+', ' ', text)

    # 去除多余的空格，包括开头和结尾的空格，并确保词之间只有一个空格
    text = ' '.join(text.split())

    return text

# 计算汉字数量的函数
def count_chinese_chars(text):
    return len(re.findall(r'[\u4e00-\u9fa5]', text))

# 读取CSV文件
try:
    df = pd.read_csv('bili_remark_data.csv', encoding='utf-8', sep='\t')
except Exception as e:
    print(f"读取CSV文件时出错：{str(e)}")
    exit(1)

# 保留原始评论数据，并创建清洗后的数据列
df['comment'] = df['comment'].apply(clean_text)

# 删除空白评论
df = df[df['comment'].str.strip().astype(bool)]

# 筛选出包含超过5个汉字的评论
df = df[df['comment'].apply(count_chinese_chars) > 5]

# 数据去重
df = df.drop_duplicates(subset='comment', keep='first')

# 保存清洗后的数据到一个新文件
try:
    df[['comment']].to_csv('cleaned_comments.csv', index=False)
    print("清洗后的数据已保存至 'cleaned_comments.csv' 文件中!")
except Exception as e:
    print(f"保存CSV文件时出错：{str(e)}")

# 输出一些统计信息
print(f"清洗后且包含超过5个汉字的评论数：{len(df)}")